package quq.missq.utils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


public class ImageUploadAsyncTask extends AsyncTask<Integer, Integer, String> {

	private Map<String, String> params;
	private Map<String, File> files;
	private String url;
	private HttpRequest.HttpRequestListener listener;
	public static final double MAX_LEANTH = 400 * 1024;

    //这句代码有点多余 ， 因为服务器是file跟files有区别 所以这里只能再添加一个参数
    private String fn = "";

	public ImageUploadAsyncTask(Map<String, String> params,
			Map<String, File> files, String url, HttpRequest.HttpRequestListener listener,String fn) {
		this.params = params;
		this.files = files;
		this.url = url;
		this.listener = listener;
        this.fn = fn;
	}

	/**
	 * 这里的Integer参数对应AsyncTask中的第一个参数 这里的String返回值对应AsyncTask的第三个参数
	 * 该方法并不运行在UI线程当中，主要用于异步操作，所有在该方法中不能对UI当中的空间进行设置和修改
	 * 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作
	 */
	@Override
	protected String doInBackground(Integer... param) {
	//	int i =0;

		try {
	/*		Set<Map.Entry<String, File>> set = files.entrySet();
			for(Iterator<Map.Entry<String, File>> it = set.iterator();it.hasNext();){
				Map.Entry<String, File> entry= (Map.Entry<String, File>) it.next();
				entry.setValue(compressImage("loadupImage"+(i++),entry.getValue()));
			}*/
			String json = HttpRequest.post(url, params, files,fn);

			return json;
		} catch (Exception e) {
			e.printStackTrace();

			return "fail";
		}
	}

	/**
	 * 这里的String参数对应AsyncTask中的第三个参数（也就是接收doInBackground的返回值）
	 * 在doInBackground方法执行结束之后在运行，并且运行在UI线程当中 可以对UI空间进行设置 无效的用户
	 */
	@Override
	protected void onPostExecute(String result) {
		if ("fail".equals(result)) {
			listener.httpError();
		} else {
			listener.httpSuccess(result);
		}
	}

	// 该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置
	@Override
	protected void onPreExecute() {
	}

	/**
	 * 这里的Intege参数对应AsyncTask中的第二个参数
	 * 在doInBackground方法当中，，每次调用publishProgress方法都会触发onProgressUpdate执行
	 * onProgressUpdate是在UI线程中执行，所有可以对UI空间进行操作
	 */
	@Override
	protected void onProgressUpdate(Integer... values) {
	}

	private  File compressImage(String fName,File file) {
		Bitmap image = BitmapFactory.decodeFile(file.getPath());
		// ImageUtil.calculateZoomSize(width, height, reqWidth, reqHeight)

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ByteArrayInputStream isBm = null;
		if (file.length() < MAX_LEANTH) {

			// image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//
			// 质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
			// isBm = new ByteArrayInputStream(baos.toByteArray());//
			// 把压缩后的数据baos存放到ByteArrayInputStream中

		} else {

			double f = file.length();
			int d = (int) (f / MAX_LEANTH);

			// bitmapZoomByScale(image,Math.sqrt(d))
			image.compress(Bitmap.CompressFormat.JPEG, 50, baos);// 质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
			isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
			BitmapFactory.Options newOpts = new BitmapFactory.Options();
			// 开始读入图片，此时把options.inJustDecodeBounds 设回true了
			newOpts.inJustDecodeBounds = false;
			newOpts.inSampleSize = d;
			//System.out.println("d======" + d);
			image.recycle();
			image = null;
			image = BitmapFactory.decodeStream(isBm, null, newOpts);
			try {
				baos.close();
				baos.flush();
				baos = null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}


		}
		//System.out.println("imageSize====>"+image.getByteCount());
		String path  = ImageUtil.saveBitmap(fName, image);
		File file2 = new File(path);
		image.recycle();
		image = null;

		return file2;

	}
}
